<?php
/**
 * @author		João Batista Neto
 * @brief		Classes e interfaces de base
 * @package		rpo.base
 */

/**
 * @brief		Interface para definição do objeto primitivo.
 * @details		IObject é a interface raiz da hierarquia de classes; Todos os objetos
 * devem implementar esssa interface.
 * @interface	IObject
 */
interface IObject {
	/**
	 * @brief	Recupera a representação do objeto como string.
	 * @details	De forma geral, __toString retorna uma string que representa este objeto
	 * na forma de texto.<br /><p>
	 * O resultado precisa ser uma informação clara que represente o objeto de uma forma que
	 * uma pessoa possa lê-lo. É recomendado que todas as subclasses sobrescrevam este método.</p>
	 * <p>O método __toString da classe Object retorna uma string que consiste no nome da classe
	 * da qual este objeto é instância seguido do caracter arroba <b>\@</b> seguido do código hash
	 * do objeto:<br />
	 * </p>
	 * <code>
	 * $this->getClass()->getName() . '@' . $this->hashCode()
	 * </code>
	 * @return	string Representação do objeto como string.
	 */
	public function __toString();

	/**
	 * @brief	Compara a igualdade entre dois objetos
	 * @details	Verifica se um objeto é igual a este.<br />
	 * <p>A implementação do método equals() na classe Object utiliza uma comparação estrita,
	 * isso significa que:<br />
	 * <code>
	 * $objA->equals( $objB );
	 * </code>
	 *
	 * Só retornará <b>true</b> se $objA === $objB<br /><br />
	 *
	 * Cada classe poderá implementar esse método da forma que for mais apropriada, utilizando
	 * inclusive, mas não necessariamente, o método hashCode() para tal comparação.</p>
	 * @param	$object IObject O objeto que será comparado com este objeto.
	 * @return	boolean
	 */
	public function equals( IObject $object );

	/**
	 * @brief	Recupera um ReflectionObject
	 * @details	Recupera uma instância de ReflectionObject que contém informações sobre
	 * o objeto
	 * @return	ReflectionObject
	 */
	public function getClass();

	/**
	 * @brief	Hash do objeto
	 * @details	Recupera um hash único para identificação do objeto. Este hash pode ser utilizado
	 * para armazenamento ou identificação de objetos em listas.
	 * @return	integer
	 */
	public function hashCode();
}